package com.kehongborui.reflecttion;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * 对对象的字符串类型的属性进行加密、解密
 */
public class RefEncodeAndDecodeDemo {
    public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {
        // 1. 要指定加密的对象
        // 2. 确定要加密的属性
        // 3. 根据要加密的属性获取对应的set 或者get 方法
        // 4. 调用方法加密或解密
        Student student = new Student();
        student.setName("jack");
        student.setAddress("航天科技大厦");
        student.setSex("男");
        encode(student, "name", "address");

        System.out.println(student);
    }

    /**
     * 加密指定的对象的指定属性
     * @param obj
     * @param parameters
     */
    public static void encode(Object obj, String ...parameters) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        Class clazz = obj.getClass();  // 获取 Class 对象

        for (String parameter : parameters) {
            Method getMethod = clazz.getMethod(getMethodName("get", parameter));  // 获取对应的 属性的 get方法
            String originValue = (String)getMethod.invoke(obj);  // 获取原始值
            originValue += "test";   // 模拟加密

            Method setMethod = clazz.getMethod(getMethodName("set", parameter), String.class);  // 获取对应的 属性的 set方法
            setMethod.invoke(obj, originValue);  // 给原始对象 的 parameter 重新赋值
        }
    }

    /**
     * 获取 属性的 get 方法名字
     * @param methodType 放法类型 set or get
     * @param parameter
     * @return
     */
    public static String getMethodName(String methodType,String parameter) {
        char[] paramCharArr = parameter.toCharArray();  // 把属性名称转换成字符数组
//        char a = 'a'; // 97
//        char A = 'A'; // 65
        paramCharArr[0] = (char) (paramCharArr[0] - 32);
        return methodType + new String(paramCharArr);
    }
}
